﻿// Inner Fire 游戏引擎库
// AnimatorEvents - 动画事件
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 用于管理动画事件。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-14

#pragma once

#include <EASTL/vector.h>
#include <static_string.h>

namespace ifire::game {
class Animator;
class AnimationClip;
struct AnimationEvent;

struct AnimatorEvent {
  // 对于AnimationEvent的引用
  const AnimationEvent* event;
  // 标记是否处理
  bool is_processed;

  // 构造函数
  AnimatorEvent(const AnimationEvent* _event)
      : event(_event), is_processed(false) {}

  // 得到名称
  ikit::sstr GetName() const;
  // 判断这个项目是否为空
  bool empty() const { return event == nullptr; }
  // 获得是否已经处理
  bool IsProcessed() const { return is_processed; }
  // 设置已经处理
  void SetProcessed() { is_processed = true; }

};

class AnimatorEvents {
public:
  AnimatorEvents(Animator* owner);
  AnimatorEvents(const AnimatorEvents& lhs) = delete;
  AnimatorEvents& operator=(const AnimatorEvents& lhs) = delete;
  ~AnimatorEvents() = default;

  // 返回一个已经还没有被执行的事件。如果没有可执行的事件，返回nullptr
  AnimatorEvent* PopEvent();

  // 添加一个触发事件
  void AddEvent(const AnimationEvent* event);

  // 从一个执行的动画中获得事件
  void PickEvent(const AnimationClip* clip, float tick);
  // 是否存在事件
  bool ContainsEvent(const AnimationEvent* target) const;

  // 清空事件
  void Clear();

private:
  // 所属的Animator
  Animator* animator_;
  // 当前拥有的事件
  eastl::vector<AnimatorEvent> events_;
};

using AnimatorEventsPtr = std::unique_ptr<AnimatorEvents>;

} // namespace ifire::game